package javaClassExercise.designPatterns.factoryMethod.staticFactoryMethod;

/**
 * Created by lomo on 2017/3/25.
 *
 * 静态工厂方法模式（静态static的、多个工厂方法类）
 * 静态工厂方法模式好处：不用new实例，直接调用， 工厂类名.方法名即可
 *
 * 顺便复习下static关键字
 */
public class StaticFactoryMethod {
    //static静态的返回类型为Sender类型的produceMail方法

    //类中的静态方法中对于本类而言：①只能访问本类的静态变量和类中其他静态方法 ②无this
    //private String name;
    public static Sender produceMail() {
        return new MailSender();
        //System.out.println(name); //报错, 静态方法中不能调用类外的非静态变量
        //test t = new test(); // 提示错误： nreachable statement, 无法访问的
    }

    public static Sender produceSms() {
        return new SmsSender();
    }

//    test t = new test(); //此处访问Ok
//    static {
//        System.out.print("静态static代码块中调用：");
//        test t = new test();  // 在static 代码块中访问也Ok.
//    }
//    public void noStaticMethod() {
//        test t = new test();  //非static里访问也OK
//        t.testC();
//        t.testD();  //非静态方法中访问其他类的非静态方法--ok!
//    }

//    public static void main(String[] args) {
//        test t = new test();
//        //输出:
//        //静态static代码块中调用：您调用了test类的构造方法 !
//        //您调用了test类的构造方法 !
//        //先执行的是本类中的static静态代码块，再执行new test()操作 -- test类中的构造函数.
//
////        t.testC();
////        //输出：
////        //您调用了test类中的非静态的testC() 方法 !
////        t.testD();
////        //输出：
////        //调用的是test类中的静态方法testD() 方法 !
//        // noStaticMethod(); // 主函数是static的，故也不可以调用非此静态方法
//    }
}

class test{
    public test() {
        System.out.println("您调用了test类的构造方法 !");
    }
    public void testC() {
        System.out.println("您调用了test类中的非静态的testC() 方法 !");
    }

    public static void testD() {
        System.out.println("调用的是test类中的静态方法testD() 方法 !");
    }
}

//无静态类，尝试创建static 的class时会自动报错